//
//  main.m
//  OC05_NSArray_NSDictionary_NSSet
//
//  Created by Rain on 16/1/29.
//  Copyright © 2016年 Rain. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Contact.h"
#import "AddressBook.h"

#if 0
/** 知识点: NSArray 不可变数组. */
void chapterOfNSArray() {

    /** 数组是一个有序集合, 只能存放对象类型. */
    
    /** 不可变数组: 数组创建好之后, 数组内的元素不能发生改变. */
    
    /** 初始化 */
    NSArray *array1 = [[NSArray alloc]initWithObjects:@"司昌宝", nil];
    /** 便利构造器 */
    NSArray *array2 = [NSArray arrayWithObjects:@"ruanqiming",@"liuhongming",@"lihechen",@"liejie",nil];
    NSLog(@"%@",array2);
    //NSInteger类型的数据,把他们存到数组中.
    NSInteger a = 2;
    NSInteger b = 3;
    NSInteger c = 4;
    NSNumber *aNumber = [NSNumber numberWithInteger:a];
    NSNumber *bNumber = [NSNumber numberWithInteger:b];
    NSNumber *cNumber = [NSNumber numberWithInteger:c];
    
    NSArray *abcArray = @[aNumber,bNumber,cNumber];
    NSLog(@"%@",abcArray);
    
    
    /** 字面量 */
    NSArray *array3 = @[@"a",@"b",@"c",@"d"];
    NSLog(@"%@",array3);
    /** 字面量方式获取数组元素(下标形式.) */
    NSLog(@"%@",array3[2]);
    /** 获取数组元素个数 */
    NSLog(@"%lu",[array3 count]);
    /** 获取数组中指定下标对应的元素 */
    NSLog(@"%@",[array3 objectAtIndex:2]);
    /** 用来判断数组中是否包含某一个给定的对象 */
    NSLog(@"%d",[array3 containsObject:@"d"]);
    /** 获取数组元素对应的索引 */
    NSLog(@"%lu",[array3 indexOfObject:@"d"]);
    /** 按照给定的字符串进行截取，将截取的多段字符串放入数组中(此方法属于NSString类的方法, 关键字 component) */
    NSString *str = [NSString stringWithFormat:@"i want to do my best"];
    NSArray *array4 = [str componentsSeparatedByString:@" "];
    NSLog(@"%@",array4);
 //   NSArray
    /** 练习: 有一个字符串(www.lanou3g.com)，通过.进行分割. */
    NSString *lanou = [NSString stringWithFormat:@"www.lanou3g.com"];
    NSArray *array5 = [lanou componentsSeparatedByString:@"."];
    NSLog(@"%@",array5);
    /** 将数组中的元素按照给定的字符串格式拼接成一个完整的字符串对象 */
    
    NSString *str1 = [array5 componentsJoinedByString:@"."];
    NSLog(@"%@",str1);
    /** 练习: 有一个数组，通过&将所有元素拼接成一个字符串. */
    NSString *str2 = [array5 componentsJoinedByString:@"&"];
    NSLog(@"%@",str2);
    
    /** 练习: 存在如下的字符串，将其中的图片的网址提取出来。
     “http://www.imanhua.com/Cover/2011-10/hyrz.jpg&http://www.imanhua.com/Cover/2011-09/op.jpg&http://www.imanhua.com/Cover/2012-04/yjdwb.jpg */
    NSString *http1 = [NSString stringWithFormat:@"http://www.imanhua.com/Cover/2011-10/hyrz.jpg&http://www.imanhua.com/Cover/2011-09/op.jpg&http://www.imanhua.com/Cover/2012-04/yjdwb.jpg"];
    NSArray *array6 = [http1 componentsSeparatedByString:@"&"];
    NSLog(@"%@",array6);
    
    
    /** 练习: 有如下一个数组，@[@“type = iOS", @"Device = iPhone", @"count = 11344115@163.com", @"password = 12345”]，将其中的内容用”&"符号拼接成一个字符串. */
    NSArray *array7 = @[@"type = iOS", @"Device = iPhone", @"count = 11344115@163.com", @"password = 12345"];
    NSString *iOS = [array7 componentsJoinedByString:@"&"];
    NSLog(@"%@",iOS);

}

/** 知识点: NSMutableArray 可变数组. */
void chapterOfNSMutableArray() {

    /** 初始化 */
    NSMutableArray *mArray1 = [[NSMutableArray alloc] initWithCapacity:5];
    /** 便利构造器 */
    NSMutableArray *mArray2 = [NSMutableArray arrayWithCapacity:9];
    /** 字面量 */
    NSMutableArray *mArray3 = [@[@"sichangbao",@"laohei",@"laozhou"]mutableCopy];
    NSLog(@"%@",mArray3);
    /** 数组中添加一个对象 */
    [mArray3 addObject:@"laoyu"];
    NSLog(@"%@",mArray3);
    /** 数组中指定位置插入一个对象 */
    [mArray3 insertObject:@"daze" atIndex:1];
    NSLog(@"%@",mArray3);
    /** 数组中移除一个对象 */
    [mArray3 removeObject:@"daze"];
    NSLog(@"%@",mArray3);
    /** 移除数组中最后一个对象 */
    [mArray3 removeLastObject];
    NSLog(@"%@",mArray3);
    /** 移除数组中所有的元素 */
 //   [mArray3 removeAllObjects];
    NSLog(@"%@",mArray3);
    /** 数组中移除指定位置的元素 */
    [mArray3 removeObjectAtIndex:1];
    NSLog(@"%@",mArray3);
    /** 使用指定的对象替换指定位置的对象 */
    [mArray3 replaceObjectAtIndex:1 withObject:@"laohei"];
    NSLog(@"%@",mArray3);
    /** 交换指定的两个下标对应的对象 */
    [mArray3 exchangeObjectAtIndex:0 withObjectAtIndex:1];
    NSLog(@"%@",mArray3);
    /**
     * 练习: 定义一个数组完成以下操作
     (1)向数组中添加三个名字。
     (2)从数组中查找指定的名字，并且用另外一个名字替换该姓名。
     (3)删除指定的名字。
     */
    NSMutableArray *mArray4 = [NSMutableArray arrayWithCapacity:3];
    [mArray4 addObjectsFromArray:@[@"sichangbao",@"laohei",@"laozhou"]];
    NSLog(@"%@",mArray4);
    [mArray4 replaceObjectAtIndex:[mArray4 indexOfObject:@"laozhou"] withObject:@"laoyu"];
    NSLog(@"%@",mArray4);
    [mArray4 removeObject:@"laoyu"];
    NSLog(@"%@",mArray4);
    
}

/** 知识点: NSDictionary 不可变字典. */
void chapterOfNSDictionary() {
    
    /**
     * 字典是一个无序的集合，用来存储具有一一对应关系的数据。
     * 字典中存储的每一个对象都是一对键值对，键值对包含两个部分key和value，key与value的值都是对象类型。
     * 对于每一对key－value称为一个条目(Entry)。
     */
    
    /** 初始化 */
    NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:@"sichangbao",@"name1",@"laohei",@"name2",@"laozhou",@"name3",nil];
    
    /** 便利构造器 */
    NSDictionary *dict1 = [NSDictionary dictionaryWithObjectsAndKeys:@"sichangbao",@"name1",@"laohei",@"name2",@"laozhou",@"name3", nil];
    
    /** 字面量 */
    NSDictionary *dict2 = @{@"name1":@"sichangbao",@"name2":@"laohei",@"name3":@"laozhou"};
    
    /** 获取字典中键值对的个数 */
    NSInteger dictCount = dict2.count;
    NSLog(@"%ld",dictCount);
    /** 获取字典中所有的键 */
    NSLog(@"%@",dict2.allKeys);
    
    /** 获取字典中所有的值 */
    NSLog(@"%@",dict2.allValues);
    /** 根据键获得对应的值 */
    NSLog(@"%@",[dict2 objectForKey:@"name2"]);
}

/** 知识点: NSMutableDictionary 可变字典. */
void chapterOfNSMutableDictionary() {
    
    /** 初始化 */
    NSMutableDictionary *dict3 = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"sichangbao",@"sName",@"laochen",@"cName", nil];
    /** 便利构造器 */
    NSMutableDictionary *dict4 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"sichangbao",@"sName",@"laochen",@"cName", nil];
    /** 字面量 */
    NSMutableDictionary *dict5 = [@{@"sName":@"sichangbao",@"cName":@"laochen"} mutableCopy];
    
    /** 字典中添加新的键值对以或者修改某一对键值对 */
    [dict5 addEntriesFromDictionary:@{@"zName":@"laozhou"}];
    NSLog(@"%@",dict5);
    //key原来不在字典里的时候就添加一对新的键值对 //setObject  forKey
    //key存在字典里的时候就是修改旧的键值对
    [dict5 setObject:@"laoyu" forKey:@"yName"];
    /** 移除指定的键对应的键值对 */
    [dict5 removeObjectForKey:@"zName"];
    NSLog(@"%@",dict5);
    /** 移除字典中所有的键值对 */
    [dict5 removeAllObjects];
    NSLog(@"%@",dict5);
    
    /**
     * 练习: 完成以下需求:
     1、定义联系人类Contact。实例变量：姓名(拼音，首字母大写)、性别、电话号码、住址、分组名称、年龄。方法：自定义初始化方法(姓名、电话号码)、显示联系人信息。
     2、在main.m中定义字典，分组管理所有联系人。分组名为26个大写的英文字母。
     3、可以添加联系人对象，如果姓名或电话号码为空，添加失败。添加联系人到匹配的分组。
     4、删除某个分组的全部联系人。
     */
    
    
    
    
    
}

/** 知识点: NSSet 不可变集合. */
void chapterOfNSSet() {
    
    /**
     * 互异性(唯一性)  集合中不能够存在两个相同的对象。
     * 无序性  集合中的对象没有顺序，先添加的对象不一定在集合中的第一个位置，后添加的也不一定在最后的位置。
     * 多用于重用池, 执行效率比数组高, 且可以避免重复元素
     
     */
    
    /** 初始化 */
    NSSet *set1 = [[NSSet alloc] initWithObjects:@"a",@"b", nil];
    
    /** 便利构造器 */
    NSSet *set = [NSSet setWithObjects:@"sichangbao",@"laohei",@"laozhou", nil];
    
    /** 获取集合中对象的个数 */
    long int a = set.count;
    NSLog(@"%ld",a);
    /** 获取集合中所有的对象 */
    NSArray *setArray = set.allObjects;
    NSLog(@"%@",setArray);
    /** 从集合中取出一个对象 */
    NSString *strSet = set.anyObject;
    NSLog(@"%@",strSet);
    /** 判断集合中是否包含某一个指定的对象 */
    NSInteger b = [set containsObject:@"sichangbao"];
    NSLog(@"%ld",b);
    /** 没有字面量 */
    
}

/** 知识点6: NSMutableSet 可变集合. */
void chapterOfNSMutableSet() {
    /** 初始化 */
    NSMutableSet *mSet1 = [[NSMutableSet alloc] initWithCapacity:5 ];
    /** 便利构造器 */
    NSMutableSet *mSet = [NSMutableSet setWithObjects:@"iOS",@"Mac",@"OS X", nil];
    /** 添加一个对象 */
    [mSet addObject:@"sichangbao"];
    /** 移除一个对象 */
    [mSet removeObject:@"iOS"];
    
    [mSet addObject:@"sichangbao"];
    
    NSInteger kk = mSet.count;
    NSLog(@"%ld",kk);
    
    
    /** 移除所有对象 */
    [mSet removeAllObjects];
    NSLog(@"%@",mSet);
}


#endif


#pragma mark - MAIN FUNCTION
int main(int argc, const char * argv[]) {
    
#pragma mark - 知识点1. NSArray 不可变数组
   // chapterOfNSArray();
    
#pragma mark - 知识点2. NSMutableArray 可变数组
   // chapterOfNSMutableArray();
    
#pragma mark - 知识点3. NSDictionary 不可变字典
   // chapterOfNSDictionary();
    
#pragma mark - 知识点4. NSMutableDictionary 可变字典
   // chapterOfNSMutableDictionary();
    
#pragma mark - 知识点5. NSSet 不可变集合
   // chapterOfNSSet();
    
#pragma mark - 知识点6. NSMutableSet 可变集合
   // chapterOfNSMutableSet();
    
//课后作业题.
    /**
     * 练习: 完成以下需求:
     1、定义联系人类Contact。实例变量：姓名(拼音，首字母大写)、性别、电话号码、住址、分组名称、年龄。方法：自定义初始化方法(姓名、电话号码)、显示联系人信息。
     2、在main.m中定义字典，分组管理所有联系人。分组名为26个大写的英文字母。
     3、可以添加联系人对象，如果姓名或电话号码为空，添加失败。添加联系人到匹配的分组。
     4、删除某个分组的全部联系人。
     */
    
    
    
    
#if 1
    //定义一个联系人对象
 //   Contact *cont1 = [Contact ContactWithName:@"Alex" withPhoneNumber:85575555];
    //定义另一个联系人对象
    Contact *cont2 = [Contact ContactWithName:@"Ai" withPhoneNumber:85523333];
    Contact *cont3 = [Contact ContactWithName:@"AA" withPhoneNumber:98765432];
    
    Contact *cont4 = [Contact ContactWithName:@"Black" withPhoneNumber:55555555];
    //定义一个可变字典,有大约26的长度
    NSMutableDictionary *groupOfAddress = [[NSMutableDictionary alloc] initWithCapacity:26];
    
    //定义一个通讯录对象,将可变字典作为属性存入
    AddressBook *book = [AddressBook AddressBookWithDictGroup:groupOfAddress];
    
    
    //------------------------!------------------------!----------------
    
    
    //创建一个key对应的可变数组
  //  NSMutableArray *letterOfArray = [NSMutableArray arrayWithCapacity:1];
    

    [book addContactWithCont:[Contact ContactWithName:@"Alex" withPhoneNumber:85575555]];
    [book addContactWithCont:cont2];
    [book addContactWithCont:cont3];
    [book addContactWithCont:cont4];

    //以数组下标输出联系人信息

//    [book showContactWithKey:@"A"];
//    
//    [book showContactWithCont:cont2];
    
    //输出全部通讯录信息
    [book showContactWithAll];
#endif
    
#if 1
    
#endif
    
    
    
    
    
    
    


    
    
    
    return 0;
}











